#coding:utf-8

#@classmethod:使类函数可以不经过实例化而直接被调用，声明函数时必须有cls(代替self
#@staticmethod：在classmethod基础上，调用的函数不传递self和cls参数
#@property：使类函数调用的时候没有括弧，像调用属性一样，如果要传参 eg：@name。setter


class Test(object):
    def __init__(self,a):
        self.a=a

    def run(self):
        print('run')
        self.jump()  #可以调用@classmethod/@staticmethod调用的函数
        self.sleep()

    @classmethod
    def jump(cls):
        print('jump')
        #cls.run() 无法调用类函数run

    @staticmethod
    def sleep():
        print('i want to sleep')

class Test1(object):
    def __init__(self,name):
        self.__name=name

    @property
    def name(self):
        return self.__name

    @name.setter  #使得能对@property调用的函数能传参
    def name(self,value):
        self.__name=value


t=Test('a')
t.run()
Test.jump()
t.jump()
Test.sleep()
t1=Test1(name='abd')
print(t1.name)
Test1.name='cccc'
print(Test1.name)
t1.name='aaaa'
print(t1.name)